package com.demo.common.lock.annotation;

import java.lang.annotation.*;

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedisLock {

    /**
     * redis锁 key名称,支持字符串模板：如：KfptAppName:Lock:{}, {}表示占位符, 由args中的参数替换
     */
    String key();

    /**
     * 模板参数,支持SpEL表达式, ex: {"#serialNo", "#serialNo.length()", "T(java.util.Random).nextInt()", "isTure?'success':'false'", "normal"}
     */
    String[] args() default {};

    /**
     * 尝试加锁，愿意等待时长，锁被占用时，等待获取锁的时间，超时返回false
     * 默认3秒，如果设置<=0，则不等待
     */
    long waitTime() default 3000;

    /**
     * 超时释放时间，到期后不论加锁业务是否处理完毕都会释放锁
     * 默认3秒，如果设置-1，则使用看门狗机制，自动续期
     */
    long leaseTime() default 3000;
}
